'''
* This is the projet for Brtc LlmOps Platform
* @Author Leon-liao <liaosiliang@alltman.com>
* @Description //TODO 
* @File: 5_study_rubableparallel_with_retriver.py
* @Time: 2025/7/13
* @All Rights Reserve By Brtc
'''
from operator import itemgetter

import dotenv
from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel

# 1、通过 runnable parallel 实现模拟一个检索过程，将 检索的内容，传递给chain 就是整个 聊天流程
# chain = "123445" | prompt|llm | parser前面的  "12345"是不能够并入到我们的主流程里面的
# 需要  多条链 并行的时候 就用 Runableparallel
dotenv.load_dotenv()

def retriver_from_anywhere(query:str):
    print(f"开始检索问题{query}的相关文档")
    return "我叫博小睿，今年18岁，存款100块"

# 1、 构建一个prompt
prompt = ChatPromptTemplate.from_template(""" 
 请根据用户的问题来回答，可以参考上下文进行问题的回答，
 <context>
 {context}
 </context>
 用户的问题是:
 {query}
 """)
# llm 的构建
llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
# 输出解析器
paraser = StrOutputParser()

chain = RunnableParallel({
    "context": lambda x:retriver_from_anywhere(x["query"]),
    "query":itemgetter("query")}
)|prompt|llm|paraser

print(chain.invoke({"query":"你好我叫什么名字？"}))